/**
 * @project_name thread
 * @package_name com.gxwz.thread
 * @file_name CreateThreadByImplCallableInterface.java
 */
package com.gxwz.thread;

import java.util.concurrent.locks.Lock;
import java.util.concurrent.locks.ReentrantLock;


/**
 * @author chendequan
 * @email 1527254027@qq.com
 * @datetime 2013-9-6 上午01:12:19
 * 
 */
public class CreateThreadByImplCallableInterface {

	/**
	 * @datetime 2013-9-6 上午01:12:19
	 * @param args
	 */
	public static void main(String[] args) {
		new CreateThreadByImplCallableInterface().init();
	}

	/**
	 * @datetime 2013-9-5 上午01:39:15
	 */
	private void init() {
		/*
		 * 两个线程同时使用了这个对象
		 */
		final Printer printer = new Printer();

		// 线程1
//		new Thread(new Callable() {  //Thread 的构造函数不接受Callable接口作为参数
//			@Override
//			public void run() {
//				while (true) {
//					try {
//						Thread.sleep(20);
//					} catch (Exception e) {
//						e.printStackTrace();
//					}
//					printer.print1("123456789");
//				}
//			}
//		}).start();

		// 线程2
		new Thread(new Runnable() {
			/*
			 * (non-Javadoc)
			 * 
			 * @see java.lang.Runnable#run()
			 */
			@Override
			public void run() {
				while (true) {
					try {
						Thread.sleep(20);
					} catch (Exception e) {
						e.printStackTrace();
					}
					printer.print1("987654321");
				}
			}
		}).start();
	}

	// 内部类
	class Printer {

		/**
		 * 直接在类内部需要共享的资源上加Lock锁；Lock锁是Java5提供的
		 * 
		 * @datetime 2013-9-5 上午01:41:47
		 * @param string
		 */
		Lock lock = new ReentrantLock();

		public void print1(String msg) {
			int len = msg.length();

			//用lock加锁，而不是用synchronized关键字
			lock.lock();  //加锁
			try {
				for (int i = 0; i < len; i++) {
					System.out.print(msg.charAt(i));
				}
				System.out.println();
			} catch (Exception e) {
				e.printStackTrace();
			} finally {  //防止异常导致锁不能解开
				lock.unlock();  //解锁
			}

		}

	}
}
